/* 
* @Author: Marte
* @Date:   2018-03-09 17:40:56
* @Last Modified by:   Marte
* @Last Modified time: 2018-04-20 18:35:00
*/
var gulp = require('gulp');                     // 引入模块
var browserSync = require("browser-sync");       // 实现web服务器,并自动刷新
    reload = browserSync.reload;
var proxyMiddleware = require('http-proxy-middleware');   // 中间件解决跨域
var sass = require('gulp-sass');                // sass
var runSequence = require('run-sequence');     //任务顺序
var cssminify = require('gulp-clean-css');      // 压缩css
var minifyHtml = require('gulp-minify-html');   // 压缩css
var uglify = require('gulp-uglify');            // 压缩js
var concat = require('gulp-concat');            // 合并
var imagemin = require('gulp-imagemin');        // 压缩图片
var babel = require('gulp-babel');              // Babel是一个广泛使用的ES6转码器
var autoprefixer = require('gulp-autoprefixer');// 浏览器版本自动处理浏览器前缀
var rename = require('gulp-rename');            // 修改文件名工具
var browserify = require('browserify');         // 模块化工具
var babelify = require('babelify');
var md5 = require("gulp-md5-plus");             // 实现文件名添加MD5并替换原有链接
var del = require('del');                       // 删除文件
var source = require('vinyl-source-stream');    // 将Browserify的bundle()的输出转换为Gulp可用的vinyl（一种虚拟文件格式）流
var config = {
        devPath: "./src",
        buildPath: "./dist"
    }
// gulp.task -- 定义任务
// gulp.src  -- 找到需要执行任务的文件
// gulp.dest -- 执行任务的文件的去处
// gulp.wacth --观察文件是否发生变化

gulp.task('copyHtml', function(){ //拷贝文件
   return gulp.src(config.devPath + '/*/*.html') // gulp.src(config.devPath + '/*/*.html')整个文件夹都会过去
        .pipe(minifyHtml({
            removeComments: true, //清除HTML注释
            collapseWhitespace: true, //压缩HTML
            collapseBooleanAttributes: true, //省略布尔属性的值 <input checked="true"/> ==> <input />
            removeEmptyAttributes: true, //删除所有空格作属性值 <input id="" /> ==> <input />
            removeScriptTypeAttributes: false, //删除<script>的type="text/javascript"
            removeStyleLinkTypeAttributes: false, //删除<style>和<link>的type="text/css"
            minifyJS: true, //压缩页面JS
            minifyCSS: true //压缩页面CSS
        }))
        .pipe(gulp.dest(config.buildPath))
})

gulp.task('imagemin', function(){ // 压缩图片
   return gulp.src(config.devPath + '/img/*')
        .pipe(imagemin())
        .pipe(gulp.dest(config.buildPath + '/img'))
})

// 编译并压缩js
gulp.task('libJs', function(){
  return gulp.src(['./src/js/ydui.flexible.js', './src/js/jquery-3.1.1.min.js','./src/js/jquery.lazyload.js','./src/js/template-web.js', './src/js/mescroll.min.js'])
    // .pipe(babel({
    //     presets: ['es2015'],
    //     plugins: ["transform-runtime"]
    // }))
    .pipe(uglify())
    .pipe(concat('lib.min.js'))
    // .pipe(md5(10 ,[config.buildPath + '/html/index.html', config.buildPath + '/html/about.html'],{
    //     dirLevel : 1,
    //     mappingFile: 'manifest.json',
    //     connector: '.'
    // }))
    .pipe(gulp.dest(config.buildPath + '/js'))
})

// 编译并压缩js
gulp.task('indexJs', function(){
  return gulp.src(['./src/js/index.js'])
    .pipe(rename('index.min.js'))
    .pipe(babel({
        presets: ['es2015']
    }))
    .pipe(uglify())
    .pipe(gulp.dest(config.buildPath + '/js'))
})

gulp.task('style', function (){
    return gulp.src([config.devPath + '/css/*.scss', config.devPath + '/css/*.css'])  //在进行 sass编译时，文件名必须为.scss
        .pipe(sass().on('error', sass.logError)) // 对样式文件进行编译,error为打印错误事件
        .pipe(cssminify()) // 格式化样式代码-去空格，合并相同的样式
        .pipe(autoprefixer({ //  兼容模式
            browsers: ['last 2 versions'],
            cascade: false
         })) 
        .pipe(concat('lib.min.css')) // 对样式文件进行编译
        // .pipe(md5(10 ,[config.buildPath + '/html/index.html', config.buildPath + '/html/about.html'],{
        //     dirLevel : 1,
        //     mappingFile: 'manifest.json',
        //     connector: '.'
        // }))
        .pipe(gulp.dest(config.buildPath + '/css')) // 生成到根目录的dest文件下
        .pipe(browserSync.stream()) // 修改自动刷新
});

gulp.task('script', ['indexJs', 'libJs'], function(){
    console.log('js')
})

// 监听文件是否发生变化
gulp.task('watch', function(){
    gulp.watch(config.devPath + "/page/*.html", ['copyHtml']).on('change', reload);
    gulp.watch(config.devPath + "/js/*.js", ['script']).on('change', reload); // 修改自动刷新
    gulp.watch(config.devPath + "/img/*", ['imagemin']).on('change', reload);
    gulp.watch(config.devPath + "/css/*.scss", ['style']);
    gulp.watch(config.devPath + "/css/*.css", ['style']);
})

gulp.task('clean', function(cb) {
    return del(['manifest.json', config.buildPath + '/css',  config.buildPath + '/js',  config.buildPath + '/img'], cb)
});

// 静态服务器
// gulp.task('browserSync', function() {
//     browserSync.init({
//         proxy: "https://movie.douban.com",
//         server: {
//             baseDir: config.buildPath, // 设置根目录
//             index: "html/index.html" // 默认指向页面
//         }
//     });
// });
gulp.task('browserSync', function() {
    // 代理配置, 实现环境切换
    var middleware = [proxyMiddleware(['/j/search_subjects'], {target: 'https://movie.douban.com', changeOrigin: true}),
                      proxyMiddleware(['/api/mobile/index.php'], {target: 'http://bbs.smartisan.com', changeOrigin: true})]

    browserSync({
        server: {
            baseDir: config.buildPath,
            index: 'page/news.html',
            middleware: middleware
        }
    });
});


gulp.task('default', function(cb) {
    runSequence(
        'clean', // 第一步：清理目标目录
        ['copyHtml', 'script', 'style', 'imagemin','browserSync'], // 第二步：打包 
        'watch', // 第三步：监控
        cb
    );
});

//执行打包发布任务
gulp.task('product', ['clean', 'copyHtml', 'libJs', 'style', 'imagemin'], function () {
    console.log('打包完毕')
});